package com.catazzz.springbootstudy.common.exception;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @作者: Tao
 * @日期: 2025/1/2
 * @时间: 13:59
 * @描述: 通用结果类，用于封装API请求的结果 <br><pre>
 * @param <T> 泛型，用于封装任意类型的响应数据
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {

    /**
     * 响应码，用于表示请求的结果状态
     */
    private Integer code;

    /**
     * 响应消息，用于提供更详细的响应信息
     */
    private String message;

    /**
     * 响应数据，用于封装请求返回的数据
     */
    private T data;

    /**
     * 成功结果的快捷创建方法
     * @return 成功结果对象，不包含任何数据
     */
    public static <T> Result<T> success() {
        return success(null);
    }

    /**
     * 成功结果的创建方法，包含数据
     * @param data 成功时返回的数据
     * @return 成功结果对象，包含指定的数据
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(MessageEnum.SUCCESS.getCode(), MessageEnum.SUCCESS.getMessage(), data);
    }

    /**
     * 错误结果的快捷创建方法
     * @return 错误结果对象，不包含任何数据
     */
    public static <T> Result<T> error() {
        return error(MessageEnum.ERROR);
    }

    /**
     * 错误结果的创建方法，包含错误信息枚举
     * @param messageEnum 错误信息枚举，用于提供错误代码和消息
     * @return 错误结果对象，包含指定的错误信息
     */
    public static <T> Result<T> error(MessageEnum messageEnum){
        return new Result<>(messageEnum.getCode(), messageEnum.getMessage(), null);
    }

    /**
     * 错误结果的创建方法，包含自定义错误消息
     * @param message 自定义错误消息
     * @return 错误结果对象，包含指定的错误消息
     */
    public static <T> Result<T> error(String message) {
        return new Result<>(MessageEnum.ERROR.getCode(), message, null);
    }

    /**
     * 错误结果的创建方法，包含自定义错误代码和消息
     * @param code 自定义错误代码
     * @param message 自定义错误消息
     * @return 错误结果对象，包含指定的错误代码和消息
     */
    public static <T> Result<T> error(Integer code, String message) {
        return new Result<>(code, message, null);
    }
}

